home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Shareware Grab Bag
/
Shareware Grab Bag.iso
/
090
/
pctj0587.arc
/
EMDUMP.ASM
< prev
next >
Wrap
Assembly Source File
|
1987-03-16
|
11KB
|
331 lines
PAGE 60,132
TITLE EMDUMP - DEMO OF SUBROUTINE TO DUMP EMS MEMORY
STACK SEGMENT WORD STACK 'STACK'
DB 100H DUP (?)
STACK ENDS
DATA SEGMENT WORD PUBLIC 'DATA'
HDRMSG DB 0AH, 0DH, 'EMDUMP - Copyright 1987, '
DB 'John A. Lefor',0AH, 0DH,'$'
EMMNAME DB 'EMMXXXX0',0 ; NAME OF EMM
NOEMMMSG DB 0AH, 0DH, 'Unable to locate EMM - '
DB 'EMDUMP terminates.$'
KEYHITMSG DB 0AH, 0DH,' Press any key to continue'
DB ' Esc to stop.$'
NOGETMSG DB 0AH, 0DH, 'Insufficient memory to save context,'
DB ' EMDUMP Aborting.$'
ERRMSG DB 0AH, 0AH, 0DH, 'EMM reports error code: '
ERRCODE DB 'XX'
ERREND DB '.$'
DUMPLINE DB 0AH, 0DH
DUMPSEG DB 'XXXX:'
DUMPOFF DB 'YYYY '
DUMPWORD DB 8 DUP('ZZZZ ')
DB '$'
CONTEXTLEN EQU 128
CONTEXT DB CONTEXTLEN DUP(?)
DATA ENDS
CODE SEGMENT PUBLIC 'CODE'
ASSUME CS:CODE,DS:DATA
FIVE EQU 5
ESCAPE EQU 27
DISPLAY EQU 09H
SCREENFULL EQU 16
PAGEFULL EQU (16*1024)/(SCREENFULL*16)
DOS EQU 21H
KEYHIT EQU 01H
DISPCHAR EQU 02H
DOSOPEN EQU 3DH
READ EQU 00H ; ACCESS MODE IS READ ACCESS
COMPAT EQU 00H ; FILE COMPATIBILITY MODE
TERMINATE EQU 4CH ; TERMINATE PROCESS
EMM EQU 67H
EMMSTATUS EQU 40H
EMMVERSION EQU 46H
EMMPAGECOUNT EQU 42H
EMMPAGEFRAME EQU 41H
EMMHANDLES EQU 4BH
EMMMAP EQU 44H
EMMALLOC EQU 43H
EMMDEALLOC EQU 45H
EMMGETSET EQU 4EH
EMMGET EQU 0
EMMSET EQU 1
EMMSIZE EQU 3
EMMSEG EQU 00H
EMMOFF EQU 019EH ; OFFSET FOR INT67 SEGMENT
HDRNAME EQU 0AH ; LOCATION OF DRIVER NAME IN HDR
PAGEZERO EQU 00H
PAGETHREE EQU 03H
; ESTABLISH IF AN EMM EXISTS IN THE SYSTEM USING
; THE OPEN HANDLE METHOD
START:
MOV AX, DATA
MOV DS, AX ; LOAD DATA SEGMENT
MOV DX, OFFSET HDRMSG ; DISPLAY COPYRIGHT NOTICE
MOV AH, DISPLAY
INT DOS
; SEE IF EMS IS AVAILABLE USING THE INTERRUPT VECTOR METHOD
MOV AX, EMMSEG ; PLACE SEGMENT ADDR
MOV ES, AX ; INTO ES REG
MOV BX, EMMOFF ; EMM VECTOR OFFSET
CLI ; DISABLE INTERRUPTS
MOV AX, ES:[BX] ; GET SEGMENT REG OF INT
STI ; RE-ENABLE INTERRUPTS
MOV ES, AX ; GET INTERRUPT SVC SEG
MOV DI, HDRNAME ; ADDR OF DEV DRIVER NAME
MOV SI, OFFSET EMMNAME ; DS:SI -> EMMXXXX0
MOV CX, 8 ; FOR COMPARE
REP CMPSB ; IS IT EMM DEVICE
JE EMMHERE
; IF NOT EMM, TERMINATE PROGRAM
MOV DX, OFFSET NOEMMMSG
MOV AH, DISPLAY
INT DOS
JMP END
EMMHERE:
; EMS IS PRESENT, CHECK EMM STATUS THEN ALLOCATE
; SPACE IN EXPANDED MEMORY.
MOV AH, EMMSTATUS ; REQUEST STATUS
INT EMM ; CALL THE EMM
OR AH, AH ; TEST RC
JZ ALLOCMEM ; IF ZERO, ALL IS WELL
CALL EMMERROR
JMP END ; IF ERROR, ALL DONE
ALLOCMEM:
MOV AH, EMMALLOC ; REQUEST EMM PAGES
MOV BX, 1 ; NEED ONLY ONE PAGE
INT EMM ; GET THE PAGE
OR AH, AH ; TEST RC
JZ MAPPAGE ; IF OK MAP THE PAGE
CALL EMMERROR ; OTHERWISE DISPLAY ERROR
JMP END
; TO FILL THE PAGE WE FIRST NEED THE BASE ADDRESS OF
; THE PAGE, THEN WE MUST MAP IT INTO MEMORY.
MAPPAGE:
MOV AL,PAGEZERO ; PLACE IN PAGE ZERO
MOV BX, 0 ; USING PAGE ZERO
MOV AH, EMMMAP ; MAP MEMORY
; DX IS STILL HANDLE FROM ALLOC
INT EMM ; CALL EMM
OR AH, AH ; TEST RC
JZ GETBASE ; IF OK, GET BASE ADDR
CALL EMMERROR
JMP END
GETBASE:
MOV AH, EMMPAGEFRAME ; GET PF ADDRESS
INT EMM ; CALL EMM
OR AH, AH ; TEST RC
JZ FILLPAGE ; IF ZERO, FILL THE PAGE
CALL EMMERROR ; ELSE REPORT ERROR
JMP END
FILLPAGE:
MOV ES, BX ; ES -> PAGE FRAME
MOV BX, 0 ; 0 IS INDEX THRU PAGE
MOV CX, (16*1024)/2 ; CX IS # OF WORDS
MOV AX, 0 ; AX IS VALUE
LOOPAGE:
MOV ES:[BX], AX ; PLACE VALUE IN EMS
INC AX
INC BX
INC BX ; -> NEXT WORD IN EMS
LOOP LOOPAGE ; LOOP THRU EMS
; AN EMS PAGE HAS BEEN FILLED NOW DUMP EMS MEMORY
MOV AX, 0 ; AX IS PAGE TO DUMP
; DX IS HANDLE TO DUMP
CALL EMSDUMP ; CALL DUMP ROUTINE
; NOW THAT WE ARE DONE, DEALLOCATE THE PAGE USED
MOV AH, EMMDEALLOC ; REQUEST DEALLOC
; DX HAS HANDLE
INT EMM ; CALL EMM
OR AH, AH ; TEST RC
JZ END
CALL EMMERROR
END:
MOV AL, 0 ; ZERO RETURN CODE
MOV AH, TERMINATE ; END PROGRAM
INT DOS
PAGE
EMSDUMP PROC NEAR
; ROUTINE TO DUMP TO THE SCREEN A PAGE OF EMS MEMORY
; CALL EMSDUMP WITH
; AX CONTAINING PAGE NUMBER
; DX CONTAINING HANDLE
PUSH AX
PUSH BX
PUSH CX
PUSH DX
PUSH DI
PUSH ES
; FIRST, SAVE THE CONTEXT OF THE EMM SO AS NOT TO UPSET
; THE CALLERS USE OF EXPANDED MEMORY
MOV AH, EMMGETSET
MOV AL, EMMSIZE
INT EMM
OR AH, AH ; TEST RET CODE
JZ CHKSIZE
CALL EMMERROR
JMP END
CHKSIZE:
CMP AL, CONTEXTLEN ; IS OUR CONTEXT ARRAY
; LARGE ENOUGH?
JG DOGET ; IF SO, DO THE GET
MOV DX, OFFSET NOGETMSG
MOV AH, DISPLAY
INT DOS
JMP END
DOGET:
MOV AH, EMMGETSET
MOV AL, EMMGET ; GET EMM CONTEXT
MOV DI, OFFSET CONTEXT
PUSH DS
POP ES ; ES:DI -> CONTEXT ARRAY
INT EMM
OR AH, AH
JZ CONTEMD
CALL EMMERROR
JMP END
; NOW THE CONTEXT HAS BEEN SAVED, WE CAN MODIFY EXPANDED MEMORY
CONTEMD:
MOV BX, AX ; LOGICAL PAGE IN BX
MOV AL, PAGETHREE ; PHYSICAL PAGE IN AL
MOV AH, EMMMAP ; DO A MAP MEMORY
; HANDLE IN DX
INT EMM ; CALL EMM
OR AH, AH ; TEST RC
JZ GETADDR
CALL EMMERROR
JMP END
GETADDR:
MOV AH, EMMPAGEFRAME ; REQUEST PAGE FRAME
INT EMM ; CALL EMM
OR AH, AH ; TEST RC
JZ DUMPPAGE
CALL EMMERROR
JMP END
DUMPPAGE:
; PLACE THE PAGE FRAME SEGMENT IN DUMP LABEL
MOV AX, BX
MOV DI, OFFSET DUMPSEG
CALL PRTHEX
; THE PAGE TO BE DUMPED IS IN PHYSICAL
; PAGE THREE. DUMP THE DATA TO THE SCREEN
MOV ES, BX ; ES -> PAGE FRAME
MOV BX, 0C000H ; BX IS OFFSET WITHIN PAGE
MOV CX, PAGEFULL ; NUMBER OF PAGES TO FILL
NEXTPAGE:
PUSH CX
MOV CX, SCREENFULL
NEXTLINE:
PUSH CX ; LOOP THRU A SCREEN
MOV AX, BX
MOV DI, OFFSET DUMPOFF
CALL PRTHEX
MOV CX, 8 ; CX IS WORDS TO CONVERT
MOV DI, OFFSET DUMPWORD ; DI -> OUTPUT LINE
DLINE:
MOV AX, ES:[BX] ; AX IS WORD
CALL PRTHEX
INC BX ; -> NEXT WORD
INC BX
ADD DI, FIVE ; -> NEXT DISPLAY
LOOP DLINE
; THE LINE HAS BEEN FORMATTED, PRINT IT ON THE SCREEN
MOV DX, OFFSET DUMPLINE ; DX -> LINE
MOV AH, DISPLAY ; REQUEST PRINT
INT DOS
; COME TO END OF LINE TRY TO FINISH A SCREEN
POP CX
LOOP NEXTLINE
MOV DX, OFFSET KEYHITMSG
MOV AH, DISPLAY
INT DOS
MOV AH, KEYHIT
INT DOS
CMP AL, ESCAPE
JE ENDUMP
POP CX
LOOP NEXTPAGE
JMP TERMDMP
ENDUMP: POP CX
; RESTORE EXPANDED MEMORY CONTEXT BEFORE RETURNING TO CALLED
MOV AH, EMMGETSET
MOV AL, EMMSET
MOV SI, OFFSET CONTEXT
INT EMM
OR AH, AH
JZ TERMDMP
CALL EMMERROR
JMP END
TERMDMP: POP ES
POP DI
POP DX
POP CX
POP BX
POP AX
RET
EMSDUMP ENDP
PAGE
EMMERROR PROC NEAR
; ROUTINE TO DISPLAY EMM ERROR MESSAGES
; PRESUMES AH CONTAINS THE ERROR CODE
MOV DI, OFFSET ERRCODE
CALL PRTHEX ; FORMAT THE HEX
MOV AX,'$.'
MOV WORD PTR ERREND, AX ; TERMINATE MESSAGE
MOV DX, OFFSET ERRMSG
MOV AH, DISPLAY
INT DOS
RET
EMMERROR ENDP
INCLUDE PRTPROC.ASM ; INSERT CONVERSION UTILITIES ROUTINES
CODE ENDS
END START